— http://pr0java.blogspot.ru/2015/12/java.html
— https://m.habrahabr.ru/company/mailru/blog/314804/
— https://stackoverflow.com/questions/9249357/difference-between-namespace-in-c-sharp-and-package-in-java
— https://tproger.ru/translations/untangling-c-declarations/
Про C#:
1. Что будет, если использовать override для метода, не объявленного как virtual?
Ответ: Ошибка.
2. Если метод объявлен как virtual у класса A, от которого наследуется класс B, а затем от B наследуется C, причем у B метод переопределен, но он не объявлен virtual, то будет ли он все равно являться virtual, как в плюсах?
Ответ: Нет. В класе B будет перекрытие и варнинг, что, возможно, делаешь хрень. Так что в С будет обычная функция, не virutal. По умолчанию в # виртуальность не ставится, надо обязательно писать override.
3. Что будет, если использовать virtual, а затем переопределять метод без override? Просто с одного конца писать virtual, а с другого override — это какое-то излишество.
Ответ: Предупреждение и перекрытие.
4. Единственное применение new — заглушать предупреждение?
Ответ: Да.
5. override в самом базовом классе — это просто дичь?
Ответ: Да.
Итого:
1) если override, обязательно выше должно быть virtual
2) override можно и опустить, но будет варнинг (работает как new, а не override, т.е. идёт перекрытие)
3) чтобы заглушить предупреждение, нужно использовать new, в том числе если не virtual
Вообще, в родительском классе прописывается virtual, чтобы обозначить виртуальную функцию; в дитятке пишется override, чтобы обозначить, что функция продолжает виртуализироваться, new, что это перекрытие и виртуализации больше нет (но вроде как считается, что если ты это делаешь, то это не оч). По умолчанию считается, что ты не хочешь виртуализировать, но об этом выскакивает предупреждение.